const path = require('path')
const rootCheck = require('root-check')
const semver = require('semver')
const colors = require('colors/safe.js')
const pathExists = require('path-exists').sync

const userHome = require('user-home')

const commander = require('commander')

const log = require('@fs-cli-dev/log')
const init = require('@fs-cli-dev/init')
const exec = require('@fs-cli-dev/exec')

const pkg = require('../package.json')
const constant = require('./const.js')

const program = new commander.Command()

let args
let config

function core() {
    try {
        prepare()
        registerCommand()
    } catch (err) {
        log.error(err.message)
    }
}

async function prepare() {
    checkPkgVersion()

    // checkNodeVersion()

    checkRootUser()
    checkUserHome()
    checkEnv()

    // checkInputArgs()

    checkGlobalUpdate()
}

// 检查版本
function checkPkgVersion() {
    log.notice('cli', pkg.version)
}

// // 检查node版本号
// function checkNodeVersion() {
//     // 获取当前Node版本号
//     const currentVersion = process.version

//     // 比对最低版本号
//     // constant.LOWEST_NODE_VERSION
//     if (!semver.gte(currentVersion, constant.LOWEST_NODE_VERSION)) {
//         throw new Error(colors.red('fs-cli: node最低版本是', constant.LOWEST_NODE_VERSION, '请升级node'))
//     }

// }

// 检查是否是 root 方式启动
function checkRootUser() {

    // process.geteuid() 是用来检查用户 级别的 0表示 管理员 sudo
    // console.log(process.geteuid());

    // root-check 检查是否是root用户启动 ，如果是就降级为普通方式启动
    rootCheck()

    // console.log(process.geteuid());
}

// 判断户主目录
function checkUserHome() {
    // console.log("用户当前主目录：", userHome);
    if (!userHome || !pathExists(userHome)) {
        throw new Error(colors.red('当前登录用户主目录不存在'))
    }
}


function checkInputArgs() {
    const minimist = require('minimist')
    args = minimist(process.argv.slice(2))

    // console.log(args);
    checkArgs()
}

function checkArgs() {
    if (args.debug) {
        process.env.LOG_LEVEL = "verbose"
    } else {
        process.env.LOG_LEVEL = "info"
    }
    // 重置 log.level
    log.level = process.env.LOG_LEVEL
}

function checkEnv() {
    const dotenv = require('dotenv')
    const dotenvPath = path.resolve(userHome, '.env')
    if (pathExists(dotenvPath)) {
        config = dotenv.config({
            path: dotenvPath
        })
    }
    createDefaultConfig()
    log.verbose("环境变量:", process.env.CLI_HOME_PATH)
}

function createDefaultConfig() {
    const cliConfig = {
        home: userHome
    }
    if (process.env.CLI_HOME) {
        cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME)
    } else {
        cliConfig['cliHome'] = path.join(userHome, constant.DEFAULT_CLI_HOME)
    }
    process.env.CLI_HOME_PATH = cliConfig.cliHome
}

// 检查是否需要更新
async function checkGlobalUpdate() {
    // 1、获取当前版本号 和 模块名称
    const currentVersion = pkg.version
    const npmName = pkg.name

    // 2、调用npm API 获取到所有版本号
    const { getNpmSemverVersion } = require('@fs-cli-dev/get-npm-info')
    const lastVersion = await getNpmSemverVersion(currentVersion, npmName, '')

    // console.log('当前版本 ', lastVersion);

    if (lastVersion && semver.gt(lastVersion, currentVersion)) {
        log.warn(colors.yellow(`当前版本是${currentVersion}，最新版本是${lastVersion}, 请手动升级 命令 \n    npm i ${npmName} -g`))
    }

    // 3、提取所有版本号，比对哪些版本是大于当前版本的

    // 4、获取最新的版本号，提示用户更新到最新版本

}

//
function registerCommand() {
    program
        .name(Object.keys(pkg.bin)[0])
        .usage('<command> [options]')
        .version(pkg.version)
        .option('-d, --debug', '是否开启调试模式', false)
        .option('-tp, --targetPath <targetPath>', '是否指定本地调试文件路径', '')


    program
        .command('init [projectName]')
        .option('-f, --force', '是否强制初始化项目')
        .action(exec)

    program.on('option:debug', () => {
        if (program._optionValues.debug) {
            process.env.LOG_LEVEL = 'verbose'
        } else {
            process.env.LOG_LEVEL = 'info'
        }
        log.level = process.env.LOG_LEVEL

        // log.verbose('test debug')
    })

    // fs-cli-dev init name  --targetPath /Users/code/work/fe/node-cli/fs-cli-dev/commands/init -f -d
    program.on('option:targetPath', () => {
        process.env.CLI_TARGET_PATH = program._optionValues.targetPath
    })

    program.on('command:*', (arr) => {
        // 有这个不会打印 program.arguments('<cmd> [options]')
        // 打印 没有命中 的 cmd options 数组
        console.log('未知命令：', arr[0]);
        const availableCommands = program.commands.map(cmd => cmd.name())
        if (availableCommands.length) {
            console.log('可用命令:', availableCommands.join(','))
        }
    })

    program.parse(process.argv)

    // 只有解析了之后，program.args才会有数据 要放在最后
    if (program.args && program.args.length < 1) {
        program.outputHelp()
        log.warn(colors.yellow('请输入命令'))
    }

}

module.exports = core